package com.cmc.cloud.cmclink.doc.api.document;

import com.cmc.cloud.cmclink.doc.api.document.rep.*;
import com.cmc.cloud.cmclink.doc.api.document.req.AttachmentUpdateReqDto;
import com.cmc.cloud.cmclink.doc.api.document.req.BlnoInfoReqDto;
import com.cmc.cloud.cmclink.doc.api.document.req.BlnoInfoReqMktDto;
import com.cmc.cloud.cmclink.doc.api.document.req.si.*;
import com.cmc.cloud.cmclink.doc.api.document.req.so.SoForecastRespVO;
import com.cmc.cloud.cmclink.doc.constant.DocApiConstants;
import com.cmes.framework.common.pojo.CommonResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * SI信息查询
 *
 * @author lzp
 */
@FeignClient(name = DocApiConstants.NAME)
@Tag(name = "RPC - 服务 SI基础信息查询")
@Valid
public interface BlnoInfoQueryApi {

    String PREFIX = DocApiConstants.PREFIX + "/SI";

    /**
     * SI详细信息查询 给预估和网厅用的
     *
     * @param blNos
     * @return
     */
    @PostMapping(PREFIX + "/query/detail/new")
    @Operation(summary = "SI详细信息查询")
    CommonResult<List<BlnoInfoRespDto>> querySiInfo(@Valid @RequestBody List<String> blNos);


    /**
     * SI详细信息查询 给EDI用的
     *
     * @param blnoEdiReqDto
     * @return
     */
    @PostMapping(PREFIX + "/query/detail/edi")
    @Operation(summary = "edi需要的提单详情信息")
    CommonResult<List<BlnoInfoRespDto>> querySiEdiInfo(@Valid @RequestBody BlnoEdiReqDto blnoEdiReqDto);


    /**
     * SI详细信息查询 给EDI用的
     *
     * @param blnoEdiReqBaseDto
     * @return
     */
    @PostMapping(PREFIX + "/query/main/edi")
    @Operation(summary = "edi需要的提单主信息")
    CommonResult<List<BlnoMainInfoEdiRespDto>> querySiEdiMainInfo(@Valid @RequestBody BlnoEdiReqBaseDto blnoEdiReqBaseDto);


    /**
     * SI详细信息查询-根据id
     *
     * @param blIds
     * @return
     */
    @PostMapping(PREFIX + "/query/detail/ids/new")
    @Operation(summary = "SI详细信息查询-根据id")
    CommonResult<List<BlnoInfoRespDto>> querySiInfoByIds(@Valid @RequestBody List<Long> blIds);

    /**
     * 提单号信息查询
     *
     * @param blnoInfoReqDtoList
     * @return
     */
    @Operation(summary = "提单信息查询")
    @PostMapping(PREFIX + "/query/blnos")
    CommonResult<List<BlnoRespDto>> queryBlNo(@Valid @RequestBody List<BlnoInfoReqDto> blnoInfoReqDtoList);

    /**
     * 提单信息查询-营销
     *
     * @param blnoInfoReqMktDtoList
     * @return
     */
    @Operation(summary = "提单信息查询-营销")
    @PostMapping(PREFIX + "/query/mkt")
    CommonResult<List<BlnoRespMktDto>> queryBlnoUserByMkt(@Valid @RequestBody List<BlnoInfoReqMktDto> blnoInfoReqMktDtoList);

    /**
     * 批量查询提单详情-网厅
     *
     * @param blnoIds
     * @return
     */
    @Operation(summary = "批量查询提单详情-网厅")
    @PostMapping(PREFIX + "/queryByIds")
    CommonResult<List<BlnoBaseInfoDto>> queryByIds(@RequestBody List<Long> blnoIds);

    /**
     * 批量查询提单收发通详情-网厅
     *
     * @param blnoIds
     * @return
     */
    @Operation(summary = "批量查询提单收发通详情-网厅")
    @PostMapping(PREFIX + "/queryBlnoScnList")
    CommonResult<Map<Long, List<BlnoScnRespDto>>> queryBlnoScnList(@RequestBody List<Long> blnoIds);

    /**
     * 批量查询提单附件详情-网厅
     *
     * @param blnoIds
     * @return
     */
    @Operation(summary = "批量查询提单附件详情-网厅")
    @PostMapping(PREFIX + "/queryBlnoAttachList")
    CommonResult<Map<Long, List<AttachmentUpdateReqDto>>> queryBlnoAttachList(@RequestBody List<Long> blnoIds);

    /**
     * 营销查询订舱人信息
     *
     * @param vslCode
     * @param voyCode
     * @param portCode
     * @return
     */
    @Operation(summary = "查询订舱人csmCode-MKT")
    @GetMapping(PREFIX + "/csmcode/mkt/{vslCode}/{voyCode}/{portCode}")
    CommonResult<List<String>> queryCsmCodeInfo(@PathVariable("vslCode") String vslCode, @PathVariable("voyCode") String voyCode, @PathVariable("portCode") String portCode);

    /**
     * 单证提供网厅根据提单号列表查询提单信息的接口
     *
     * @param blnoWebReqDto
     * @return
     */
    @Operation(summary = "单证提供网厅根据提单号列表查询提单信息的接口")
    @PostMapping(PREFIX + "/query/blnoinfo/blno")
    CommonResult<List<BlnoWebInfoRespDto>> queryBlnoInfoByBlno(@Valid @RequestBody BlnoWebReqDto blnoWebReqDto);

    /**
     * 单证提供网厅根据船名航次获取提单列表信息的接口
     *
     * @param blnoWebVslVeyReqDto
     * @return
     */
    @Operation(summary = "单证提供网厅根据船名航次获取提单列表信息的接口")
    @PostMapping(PREFIX + "/query/blnoinfo/vslvoy")
    CommonResult<List<BlnoWebInfoRespDto>> queryBlnoInfoByVslVoy(@Valid @RequestBody BlnoWebVslVeyReqDto blnoWebVslVeyReqDto);

    /**
     * 根据提单id获取多个so的信息
     * @param blnoId
     * @return list
     */
    @Operation(summary = "根据提单id获取多个so的信息")
    @GetMapping(PREFIX +"/getBlnoMultipleSoDos/{blnoId}")
    CommonResult<List<BlnoMultipleSoResqVo>> getBlnoMultipleSoDos(@PathVariable("blnoId") Long blnoId);
}
